<?php
/*
 *	Created on 2008-04-12 / 18:07:00
 *	Filename: table.php
 *	User: tomusdrw (tomusdrw.blacksoft.pl)
 *	@author: Blacksoft.pl (c) 2008
 *	@package: 
 *	
 */
 function nonl($tekst) {
 	return str_replace(array("\n\r", "\n", "\r"), "", $tekst);
 }
 function br2nl($tekst) {
 	return str_ireplace(array("<br>", "<br />", "<br/>"), "\n", $tekst);
 }
interface Itable {
	//public function __construct(&$db, $table_name, $cols_name=0, $tryb='silent');
	/**
	 * Funkcja zwracająca tablice w formacie $tablica[0] -> wiersz
	 * @param string [typ] jakiego typu ma byc zwracana tablica (=array=both;row=pola numerowane;assoc=pola-nazwy kolumn;)
	 * @return array tablica zawierająca poszczególne wiersze
	 */
	public function get($limit=0, $sort='', $order=0, $typ='assoc'); //pobiera cala tabele [typ row=pola numerowane;assoc=pola-nazwy kolumn;array=both]
	/**
	 * Funkcja, która przepisuje cała tablice od nowa
	 * @param array $dane dane w formacie tablicy dwuwymiarowej tablica[wiersz][pole]
	 * @return int Zwraca 0 jeśli się udało; 1 - niepoprawne dane wejsciowe; 2 - nie znaleziono pliku lub nie mozna do niego zapisac
	 */
	public function save($dane); //przepisuje cala tabele
	/**
	 * Sortuje tablice dwuwymiarowa algorytmem quicksort wg jakiegos pola
	 * @param array &$dane tablica wejsciowa
	 * @param mixed $col numer kolumny lub nazwa pola
	 */
	public static function sort(&$dane, $col); //sortuje $dane;
	/**
	 * Wybiera z tablicy wiersze które spełniają podane warunki
	 * @param mixed $kolumny array/string ktore pola bierzemy pod uwage
	 * @param mixed $wartosci array/string wartosci do porownania z polami
	 * @param mixed $operatory array/string operator porównawczy
	 * @return array Tablica dwuwymiarowa
	 */
	public function select($kolumny,$wartosci,$operatory='=', $limit=0); //wybiera wiersza o danym warunku
	/**
	 * Single Select
	 * Wyciąga tylko jeden rekord z tabeli i zwraca go jako tablice jednowymiarowa
	 */
	public function sselect($kolumny, $wartosci, $operatory='=');
	/**
	 * Uaktualnia rekordy składnia taka jak przy select + $dane ktore wpisac zamiast tamtych
	 * @param mixed $kolumny array/string ktore pola bierzemy pod uwage
	 * @param mixed $wartosci array/string wartosci do porownania z polami
	 * @param mixed $operatory array/string operator porównawczy
	 * @param array $dane uaktualnione wiersze
	 * @return int Zwraca 0 jeśli się udało; 1 - niepoprawne dane wejsciowe; 2 - nie znaleziono 
	 */
	public function update($kolumny,$wartosci,$operatory='=', $dane); //uaktualnia wiersze o danym warunku
	/**
	 * Dodaje nowy wiersz na koniec tablicy
	 * @param array $dane Wiersz do dodania
	 * @return int czy sie udalo(0)
	 */
	public function insert($dane); //tworzy nowy rekord $dane na koncu tablicy
	public function delete($kolumny, $wartosci, $operatory='=');
};

class Ctable {
	/**
	 * Sortuje tablice dwuwymiarowa metoda quicksort
	 * @param array &$dane adres tablicy do posortowania
	 * @param string $col wg ktorej kolumny sortowac
	 * @param bool order porzadek: 0 - rosnaco; 1 - malejaco
	 */
	public static function sort(&$dane, $col, $order=0) {
		$a = Ctable::qsortdesc($dane, $col);
		if (!$order&&is_array($dane)) $dane = array_reverse($dane);
		return $a;		
	}
	
	public function sselect($kolumny, $wartosci, $operatory='=') {
		$a = $this->select($kolumny,$wartosci, $operatory, 1);
		return $a[0];
	}
	public function debug($msg, $co = null, $dbg_type = DBG_ERROR, $dbg_lvl=1) {
		global $bot;
		debug('TABLE('.$this->name.'): '.$bot->lang->text($msg, $co), $dbg_type, $dbg_lvl);
	}
	
	public static function qsortdesc(&$dane, $col) { //sortuje malejaco za pomoca quicksort(chyba) :P
		if (is_array($dane)) {
			if (count($dane)>2) {	
				$dziel = $dane[rand(0,count($dane)-1)][$col];
				$mniej=array();
				$wiecej=array();
				$rowne=array();
				foreach ($dane as $el) {
					if ($el[$col]>$dziel) {
						$wiecej[count($wiecej)]=$el;
					} elseif ($el[$col]<$dziel) {
						$mniej[count($mniej)]=$el;
					} else {
						$rowne[count($rowne)]=$el;
					}
				}
				if ($rowne!=$dane) {
					Ctable::qsortdesc($wiecej,$col);
					Ctable::qsortdesc($mniej,$col);
					
					//dopisywanie reszty
					foreach ($rowne as $el) {
						$wiecej[count($wiecej)]=$el;
					}
					foreach ($mniej as $el) {
						$wiecej[count($wiecej)]=$el;
					}
				
					$dane=$wiecej;
				} else 
					$dane=$rowne;
				
			} elseif (count($dane)==2) {
				if ($dane[0][$col]<$dane[1][$col]) {
					$dane=array_reverse($dane);
				}
			
			}
			return 0;
		}
		return 2;
	}
};
?>